package 单例模式.饿汉式;

/**
 * 饿汉式就是在类加载的时候通过静态（变量、代码块）的形式创建
 * 这样做的好处是 线程安全 坏处是不能实现懒加载
 */
public class Singleton {
    public static void main(String[] args) {
    Singleton2 s  = Singleton2.getInstance();
    Singleton2 s1  = Singleton2.getInstance();
        System.out.println(s.hashCode());
        System.out.println(s1.hashCode());
    }
}

/**
 * 通过静态变量
 * 不能实现懒加载
 * 可能会造成内存浪费
 */
class Singleton1{
    // 1.构造器私有化，防止外部new
    private Singleton1(){

    }
    // 2.创建内部静态对象实例
    private final static Singleton1 instance = new Singleton1();

    // 3.对外提供静态方法，返回实例对象
    public static Singleton1 getInstance(){
        return instance;
    }
}

/**
 * 通过静态代码块
 * 不能实现懒加载
 * 可能会造成内存浪费
 */
class Singleton2{
    // 1.构造器私有化，防止外部new
    private Singleton2(){

    }
    // 2.创建内部静态对象实例
    private static Singleton2 instance;

    static {
        instance= new Singleton2();
    }
    // 3.对外提供静态方法，返回实例对象
    public static Singleton2 getInstance(){
        return instance;
    }
}